/**
 * 2018/6/29 10:07:28 Wen Jun created.
 */

package com.diver.flinkdemo.service.impl;

import com.diver.flinkdemo.entity.xxt.User;
import com.diver.flinkdemo.mapper.mysqlMapper.UserMapper;
import com.diver.flinkdemo.service.IUserService;
import com.diver.flinkdemo.utils.DynamicDataSourceUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;

/**
 * 用户 Service 实现
 * Created by Wen Jun on 2018/06/29.
 */
//@Service
@Slf4j
public class UserService implements IUserService {

//    //获取accessToken(获取用户数据)
//    private String USER_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
//
//    @Autowired
//    private IUserDao userDao;
//    @Autowired
    private UserMapper mapper;
    private SqlSession session;
//
//    @Autowired
//    private ManageClient manageClient;
//
//    @Autowired
//    private IRedisService redisService;
//
//    @Autowired
//    private GetSignUtil getSignUtil;
//
//    @Autowired
//    private IHttpService httpService;
//
//    @Autowired
//    protected IStudentCardService studentCardService;
//
//    @Autowired
//    private UserStudentCardService userStudentCardService;
//    @Autowired
//    private UserLoginMapper userLoginMapper;
//    @Autowired
//    private UserLoginService loginService;
//
//    @Override
//    public IIbatisDataProvider<User, String> getModelDao() {
//        return this.userDao;
//    }
//
//    @Override
//    public PagedList<UserDto> queryUserList(int pageNumber, int pageSize) {
//        int count = mapper.queryUserCount();
//        PagedList<UserDto> pagedList = new PagedList<>();
//        pagedList.setTotalSize(count);
//        if (count > 0) {
//            if (pageSize <= 0) {
//                pageSize = 10;
//            }
//            int start = (pageNumber < 1 ? 0 : (pageNumber - 1)) * pageSize;
//            List<UserDto> userList = mapper.queryUserList(start, pageSize);
//            pagedList.setList(userList);
//        }
//        return pagedList;
//    }
//
    @Override
    public String getChannalName(String accountId) {
        try {
            session = DynamicDataSourceUtil.mysqlSessionFactory.openSession();
            mapper = session.getMapper(UserMapper.class);
            return mapper.getChannalName(accountId);
        } finally {
            endOfSession(session);
        }
    }
//
//    @Override
//    public String teacherBind(String userName, String password, String userId, HttpServletRequest request) {
//        String teacherId = manageClient.getAdminByCount(userName, password);
//        if (StringUtils.isBlank(teacherId)) {
//            return ApiResultGenerator.paramErrorResult("账户不存在或密码错误");
//        }
//        QueryParams params = new QueryParams();
//        params.addParameter("teacherId", teacherId);
//        List<User> userList = this.queryList(params);
//        if (!CollectionUtils.isEmpty(userList)) {
//            return ApiResultGenerator.paramErrorResult("当前教师账号已绑定");
//        }
//        User u = this.getModelById(userId);
//        if (StringUtils.isNotBlank(u.getTeacherId())) {
//            return ApiResultGenerator.paramErrorResult("当前用户账号已绑定");
//        }
//        u.setTeacherId(teacherId);
//        this.doUpdateModel(u);
//
//        String userToken = request.getHeader(CommonResource.REDIS_KEY_USERTOKEN);
//        UserRedis userRedis = (UserRedis) redisService.get(userToken, UserRedis.class);
//        userRedis.setTeacherId(teacherId);
//        redisService.set(userToken, userRedis);
//        return ApiResultGenerator.successResult("绑定成功");
//    }
//
//    @Override
//    public boolean teacherUnbind(String teacherId) {
//        QueryParams params = new QueryParams();
//        params.addParameter("teacherId", teacherId);
////        User u = Optional.ofNullable(this.queryList(params)).map(l -> l.get(0)).orElse(null);
//        List<User> userList = this.queryList(params);
//        if (CollectionUtils.isNotEmpty(userList)) {
//            for (User u : userList) {
//                //正常情况只有一条绑定
////                User u = userList.get(0);
//                u.setTeacherId(null);
//                this.doUpdateModel(u);
//                String token = Md5Utils.md5(CommonResource.TOKEN_REDIS_TEACHER + u.getId());
//                UserRedis userRedis = (UserRedis) redisService.get(token, UserRedis.class);
//                userRedis.setTeacherId(null);
//                redisService.set(token, userRedis);
//            }
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public User queryByOpenId(String openId) {
//        User user = userDao.queryByOpenId(openId);
//        return user;
//    }
//
//    @Override
//    public void authorizeCallback(String code, String userId) {
//        String appId = PropertyUtil.readValue("appIDWalrus");
//        String secret = PropertyUtil.readValue("appSecretWalrus");
//        //获取accessToken
//        String access = getAccessToken(appId, secret, code);
//        if (StringUtils.isEmpty(access)) {
//            access = getAccessToken(appId, secret, code);
//            if (StringUtils.isEmpty(access)) {
//                logger.info("UserService->oauth,再次获取accessToken和openId失败");
//                return;
//            }
//        }
//        logger.info("access:" + access);
//        JSONObject jsonObject = JSON.parseObject(access);
//        String hxOpenid = jsonObject.getString("openid");
//        if (StringUtils.isEmpty(hxOpenid)) {
//            logger.info("海象openid为null");
//            return;
//
//        }
//        //判断该用户是否已存在
//        User user = this.getModelById(userId);
//        if (user != null) {
//            user.setWalrusOpenId(hxOpenid);
//            this.doUpdateModel(user);
//            logger.info("更新海象openid成功：" + hxOpenid);
//        }
//    }
//
//    @Override
//    public void tlAuthorizeCallback(String code, String userId) throws IOException {
//        String tlOpenId = getTLOpenId(code);
//        if (StringUtils.isEmpty(tlOpenId)){
//            logger.info("天立openid为null");
//            return;
//        }
//        //判断该用户是否已存在
//        User user = this.getModelById(userId);
//        if (user != null) {
//            user.setWalrusOpenId(tlOpenId);
//            this.doUpdateModel(user);
//            logger.info("更新天立openid成功：" + tlOpenId);
//        }
//    }
//
//    /**
//     * 天立获取openid
//     * @return
//     * @throws IOException
//     */
//    private String getTLOpenId(String code) throws IOException {
//        String url = "https://api-cloud.qimingdaren.com/cloud/api/wx/wechat/user-info";
//        String param = "code=" + code;
//        Map<String,String> header = new HashMap<>();
//        String appid = getSignUtil.appid;
//        String timeStamp = getSignUtil.getTimeStamp();
//        Map<String,Object> data = new HashMap<>();
//        data.put("code",code);
//        data.put("appid",appid);
//        data.put("timestamp",timeStamp);
//        String sign = getSignUtil.sign(data);
//        header.put("appid",appid);
//        header.put("timestamp",timeStamp);
//        header.put("sign",sign);
//        String result = cn.com.keydom.xxtauth.utils.hjy.HttpClientUtils.sendGet(url,param,header);
//        TLJYResultModel model = JSON.parseObject(result,TLJYResultModel.class);
//        if (model.getCode() == 200){
//            TLJYResultData resultData = model.getData();
//            return resultData.getOpenid();
//        }else {
//            logger.info("调用天立获取openid失败,code{},msg{}",model.getCode(),model.getMsg());
//            return null;
//        }
//    }
//
//    /**
//     * 和教育返回学生信息
//     *
//     * @param studentid
//     * @return
//     */
//    @Override
//    public String getHjyStudentInfo(@RequestParam String studentid) {
//        if (!"".equals(studentid) && studentid != null) {
//            String url = "https://openapi.schxy.net:8080/typtOauth/typt/qry_studentInfo_zn";
//            Map<String, String> params = new HashMap<>();
//            Map<String, String> headers = new HashMap<>();
//            headers.put("Content-Type", "application/x-www-form-urlencoded");
//            params.put("data", "{\"studentid\":\"" + studentid + "\"}");
//            //向第三方发送请求
//            ResultConfig<String> resultConfig = HttpClientUtils.doPost(url, headers, params);
//            logger.info("和教育获取学生详细信息响应:{}", resultConfig);
//            try {
//                if (!"".equals(resultConfig.getResultData()) && resultConfig.getResultData() != null) {
//                    logger.info("和教育返回学生信息为 {}", resultConfig.getResultData());
//                    HjyStudentInfo hjyResult = JSONObject.parseObject(resultConfig.getResultData(), HjyStudentInfo.class);
//                    if (hjyResult != null) {
////                        HjyStudentInfo hjyStudentInfo = hjyResult;
//
//                        CardInfo[] infos = hjyResult.getCardInfos();
//                        String imei = infos[0].getCardIMEI();
//                        String schoolInfo = Md5Utils.md5(imei);
//                        HjyStudentInfo userRedis = (HjyStudentInfo) redisService.get(schoolInfo, HjyStudentInfo.class);
//                        if (userRedis == null) {
//                            userRedis = new HjyStudentInfo();
//                            userRedis.setClassName(hjyResult.getClassName());
//                            userRedis.setGradeName(hjyResult.getGradeName());
//                            userRedis.setSchoolName(hjyResult.getSchoolName());
//                        }
//                        redisService.set(schoolInfo, userRedis);
//                        logger.info("userRedis:{}", userRedis.toString(), schoolInfo);
//
//                        int count = updateStudentInfo(hjyResult);
//                        if (count == -1) {
//                            logger.info("imei号为空");
//                            return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "请先购买学生证", null);
//                        } else if (count == 0) {
//                            return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "未找到该设备信息，请联系设备提供商！！！", null);
//                        }
//                        return ApiResultGenerator.successResult(hjyResult);
//                        /*switch (count){
//                            case -1 :
//                                logger.info("imei号为空");
//                                return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "imei号为空", null);
//                            case 0 :
//                                return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "imei号未注册", null);
//                            default :
//                                return ApiResultGenerator.successResult(hjyStudentInfo);
//                        }*/
//                    }
//                    return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "和教育返回错误信息：" + hjyResult.getError_msg(), null);
//                } else if (resultConfig.getResultCode() == 200 && "".equals(resultConfig.getResultData())) {
//                    logger.info("和教育返回用户信息为空");
//                    return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "和教育返回用户信息为空", null);
//                } else {
//                    logger.info("获取学生信息失败code:{},msg:{}", resultConfig.getResultCode(), resultConfig.getMsg());
//                    return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "获取学生信息失败", null);
//                }
//            } catch (Exception e) {
//                logger.error("", e);
//            }
//        }
//        return ApiResultGenerator.errorResult(ApiResult.PARAM_ERROR_CODE, "授权登录信息返回为空", null);
//    }
//
//    /**
//     * 绑定
//     *
//     * @param hjyStudentInfo
//     * @return
//     */
//    @Override
//    public String bind(HjyStudentInfo hjyStudentInfo) {
//        logger.info("hjy bind params:{}", hjyStudentInfo);
//        JSONObject result = new JSONObject();
//        try {
//            if (null != hjyStudentInfo) {
//                String hjyAccountId = hjyStudentInfo.getUserId();
//                String studentName = hjyStudentInfo.getUserName();
//                CardInfo[] cardInfos = hjyStudentInfo.getCardInfos();
//                String imei = null;
//                for (CardInfo cardInfo : cardInfos) {
//                    imei = cardInfo.getCardIMEI();
//                }
//                User user = getUser(hjyAccountId, true);
//                String userId = user.getId();
//                QueryParams qp = new QueryParams();
//                qp.addParameter("imei", imei);
//                List<StudentCard> studentCards = studentCardService.queryList(qp);
//                if (!CollectionUtils.isEmpty(studentCards)) {
//                    StudentCard studentCard = studentCards.get(0);
//                    String studentCardId = studentCard.getId();
//                    //判断是否重复绑定
//                    QueryParams bindParams = new QueryParams();
//                    bindParams.addParameter("studentCardId", studentCardId);
//                    bindParams.addParameter("userId", userId);
//                    int count = userStudentCardService.queryCount(bindParams);
//                    if (count > 0) {
//                        result.put("code", "004");
//                        result.put("message", "重复绑定");
//                    } else {
//                        UserStudentCard userStudentCard = new UserStudentCard();
//                        userStudentCard.setStudentCardId(studentCardId);
//                        userStudentCard.setUserId(userId);
//                        userStudentCard.setIsTip(1);
//                        userStudentCard.setCreateTime(System.currentTimeMillis());
//
//                        userStudentCardService.doAddModel(userStudentCard);//添加绑定信息
//                    }
//                    if (StringUtils.isNotBlank(studentName)) {//修改名字
//                        StudentCard sc = new StudentCard();
//                        sc.setId(studentCardId);
//                        sc.setName(studentName);
//                        sc.setUpdateTime(System.currentTimeMillis());
//                        sc.setUpdatePersion("dx");
//                        studentCardService.doUpdateSelectiveById(sc);
//                    }
//                    result.put("code", "000");
//                    result.put("message", "成功");
//                }
//            } else {
//                result.put("code", "001");
//                result.put("message", "绑定失败");
//            }
//        } catch (Exception e) {
//            logger.error("hjy bind", e);
//        }
//        return result.toString();
//    }
//
//    @Override
//    public int addHjyUser(User user) {
//        user.setId(UUIDUtil.uuid());
//        user.setWalrusFlag("0");
//        user.setAccountId(BindChannelEnum.SC_HJY.getBindChannel());
//        user.setCreateTime(System.currentTimeMillis());
//        String openId = user.getOpenId();
//        logger.info("addHjyUser:User", user);
//        QueryParams queryParams = new QueryParams();
//        queryParams.addParameter("openId", openId);
//        int queryCount = userDao.queryCount(queryParams);
//        if (queryCount >= 1) {
//
//            return 2;
//        }
//        int insertCount = userDao.insertObject(user);
//        if (insertCount == 1) {
//            return 1;
//        }
//        return 0;
//    }
//
//    /**
//     * 查询用户信息 openid/第三方id 和渠道id
//     * @param openId
//     * @param accountId
//     * @param phoneNumber
//     * @param parentName
//     * @return
//     */
//    @Override
//    public User getUserByOpenIdAndAccountId(String openId, String accountId, String phoneNumber, String parentName) {
//        QueryParams queryParams = new QueryParams();
//        queryParams.addParameter("openId", openId);//第三方平台用户id
//        queryParams.addParameter("accountId", accountId);//查询条件增加渠道号，避免不同渠道用户id重复
//        queryParams.addParameter("delete_flag", 0);
//        List<User> userList = queryList(queryParams);
//        User user = new User();
//        if(userList.size() > 0){
//            user = userList.get(0);
//            if(!parentName.equals(user.getUserName()) || !phoneNumber.equals(user.getPhone())){
//                user.setPhone(phoneNumber);
//                user.setUserName(parentName);
//                user.setUpdateTime(System.currentTimeMillis());
//                this.doUpdateModel(user);
//            }
//        }else{
//            user.setId(UUIDUtil.uuid());
//            user.setOpenId(openId);
//            user.setWalrusFlag("0");
//            user.setAccountId(accountId);
//            user.setPhone(phoneNumber);
//            user.setUserName(parentName);
//            user.setCreateTime(System.currentTimeMillis());
//            user = this.doAddModel(user);
//        }
//        return user;
//    }
//
//    /**
//     * 检查WX ID是否登录手机号
//     * @param openId
//     * @return
//     */
//    @Override
//    public UserLogin checkLogin(String openId) {
//        QueryWrapper<UserLogin> wrapper = new QueryWrapper<>();
//        wrapper.eq("open_id", openId);
//        wrapper.eq("is_login", 1);
//        List<UserLogin> userLoginList = userLoginMapper.selectList(wrapper);
//        if (userLoginList.isEmpty()) {
//            return null;
//        }
//        UserLogin userLogin = userLoginList.get(0);
//        if (1== userLogin.getIsLogin()) {
//            return userLogin;
//        }
//        return null;
//    }
//
//    /**
//     * 检查是否绑定
//     * @param
//     * @return
//     */
//    @Override
//    public boolean checkBind(String imei,String openId) {
////        String imei = userLogin.getImei();
////        String openId = userLogin.getOpenId();
//        //查userId和studentCardId
//        StudentCard studentCardByImei = studentCardService.getStudentCardByImei(imei);
//        if(studentCardByImei == null) {
//            return false;
//        }
//        String studentCardId = studentCardByImei.getId();
//        QueryParams queryParams = new QueryParams();
//        queryParams.addParameter("openId", openId);//第三方平台用户id
//        List<User> users = queryList(queryParams);
//        if (users.isEmpty()) {
//            return false;
//        }
//        User user = users.get(0);
//        String userId = user.getId();
//        QueryParams queryParams2 = new QueryParams();
//        queryParams2.addParameter("studentCardId", studentCardId);
//        queryParams2.addParameter("userId", userId);
//        //通过studentCardId和userId查询绑定记录
//        int count = userStudentCardService.queryCount(queryParams2);
//        if (count > 0) {
//            return true;
//        }
//        return false;
//    }
//
//
//    public User getUser(String hjyAccountId, boolean needCreate) {
//        String accountId = BindChannelEnum.SC_HJY.getBindChannel();
//        QueryParams queryParams = new QueryParams();
//        queryParams.addParameter("openId", hjyAccountId);//第三方平台用户id
//        queryParams.addParameter("accountId", accountId);//查询条件增加渠道号，避免不同渠道用户id重复
//        List<User> users = queryList(queryParams);
//        if (!org.springframework.util.CollectionUtils.isEmpty(users)) {
//            return users.get(0);
//        }
//        if (needCreate) {
//            //新用户，创建
//            User user = new User();
//            user.setId(UUIDUtil.uuid());
//            user.setOpenId(hjyAccountId);
//            user.setAccountId(accountId);
//            user.setCreateTime(System.currentTimeMillis());
//            logger.info("getUser:创建新用户", user);
//            doAddModel(user);
//            return user;
//        }
//        return null;
//    }
//
//    /**
//     * 将信息存到数据库
//     *
//     * @param hjyStudentInfo
//     */
//    private int updateStudentInfo(HjyStudentInfo hjyStudentInfo) {
//        CardInfo[] infos = hjyStudentInfo.getCardInfos();
//        String imei = infos[0].getCardIMEI();
//        if (!"".equals(imei) && imei != null) {
//            StudentCard studentCard = new StudentCard();
//            /*studentCard.setClassId(hjyStudentInfo.getClassId());
//            studentCard.setClassName(hjyStudentInfo.getClassName());
//            studentCard.setGradeId(hjyStudentInfo.getGradeId());
//            studentCard.setGradeName(hjyStudentInfo.getGradeName());
//            studentCard.setSchoolId(hjyStudentInfo.getSchoolId());
//            studentCard.setSchoolName(hjyStudentInfo.getSchoolName());*/
//            CardInfo[] cardInfo = hjyStudentInfo.getCardInfos();
//            String cardImei = cardInfo[0].getCardIMEI();
//            /*String cardNumber = cardInfo[0].getCardNumber();
//            studentCard.setCardNumber(cardNumber);*/
//            studentCard.setImei(cardImei);
//            studentCard.setName(hjyStudentInfo.getUserName());
//            //studentCard.setStudentCode(hjyStudentInfo.getStuCode());
//            int count = studentCardService.updateStudentCard(studentCard);
//            if (count == 0) {
//                logger.info("imei号未注册");
//                return count;
//            }
//            return count;
//        }
//        return -1;
//    }
//
//
//    /**
//     * 获取accessToken和openId
//     *
//     * @param appId
//     * @param secret
//     * @param code
//     * @return
//     * @throws Exception
//     */
//    private String getAccessToken(String appId, String secret, String code) {
//        Map<String, String> params = new HashedMap();
//        params.put("appid", appId);
//        params.put("secret", secret);
//        params.put("code", code);
//        params.put("grant_type", "authorization_code");
//        try {
//            String result = HttpUtils.doGet(USER_ACCESS_TOKEN_URL, params, null, "UTF-8");
//            if (StringUtils.isNotEmpty(result)) {
//                return result;
//            } else {
//                logger.info("海象授权获取AccessToken错误");
//            }
//        } catch (Exception e) {
//            logger.info("海象授权获取AccessToken错误");
//        }
//        return null;
//    }
    
    public String queryNickname(String id) {
        try {
            session = DynamicDataSourceUtil.mysqlSessionFactory.openSession();
            mapper = session.getMapper(UserMapper.class);
            return mapper.queryNickname(id);
        } finally {
            endOfSession(session);
        }
    }

    @Override
    public User getById(String id) {
        try {
            session = DynamicDataSourceUtil.mysqlSessionFactory.openSession();
            mapper = session.getMapper(UserMapper.class);
            return mapper.selectById(id);
        } finally {
            endOfSession(session);
        }
    }

    public void endOfSession(SqlSession session) {
        //关闭sqlSession
        if (session != null) {
            log.info("session commit -> session close");
//            session.commit();
            session.close();
        }
    }
}
